package main

import (
	"encoding/json"
	"fmt"
)

// 结构体与Json
// 序列化：go语言结构变量 --> json字符串  code -》 enceode
// 返序列化：json字符串 --> go语言结构变量 enceode -》 code

// 定义一个学生的结构体
type student struct {
	// name string  // 因为小写相当于私有变量，在main包中能访问，但是json包里访问不到
	// age  int
	Name string // 大写相当于公有变量
	Age  int    `json:"age" db:"AGE"` // 前端要求返回小写,数据库要求返回大写
}

func main() {
	s := student{Name: "致幻", Age: 999} // 学生初始化
	// 序列化
	b, err := json.Marshal(s)
	if err != nil {
		fmt.Printf("marshal faile :%v\n", err)
		return
	}
	fmt.Printf("%v\n", string(b))  // 字节切片和字符串之间的强转，结果：{"Name":"致幻","age":999}
	fmt.Printf("%#v\n", string(b)) // 查看详细信息

	// 反序列化
	str := `{"name":"致幻","age":999}` // 这里的反引号是原样输出
	var s1 student                   // 声明s1的类型
	json.Unmarshal([]byte(str), &s1) // 传参都是copy，修改函数内部，需要传指针
	fmt.Printf("%#v\n", s1)          // main.student{Name:"致幻", Age:999}
}
